/************************************************************
 * Project Name         [Thinking_In_Java]
 * File Name            [Example_06_Triangle.java]
 * Creation Date        [18-Jun-2014]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ************************************************************/
package pkg_02_oop;

/**
 * 图形实现类 - 三角形
 * 
 * @author 不落的太阳(Sean Yang)
 * @version 1.0
 * @since JDK 6
 * 
 */
public class Example_06_Triangle extends Example_06_Abstract_Shape {

	// 边a的长度
	private double sideA;
	// 边b的长度
	private double sideB;
	// 边c的长度
	private double sideC;

	/**
	 * 边长错误
	 */
	public static final String SIDE_ERROR = "三角形的边长必须大于0";
	/**
	 * 不能构成三角形的错误
	 */
	public static final String SHAPE_ERROR = "三角形的两边之和必须大于第三边";

	/**
	 * 默认构造方法
	 */
	public Example_06_Triangle() {
		this.init();
	}

	/**
	 * 用默认的三条边构成一个三角形, 用于初始化
	 */
	private void init() {
		this.sideA = 3;
		this.sideB = 4;
		this.sideC = 5;
	}

	/**
	 * 用三条边构成一个三角形
	 * 
	 * @param sideA
	 *            边a的长度
	 * @param sideB
	 *            边b的长度
	 * @param sideC
	 *            边c的长度
	 */
	public Example_06_Triangle(double sideA, double sideB, double sideC) {
		// 如果给定的三边能构成三角形, 那么用给定的变长构成三角形
		if (isTriangle(sideA, sideB, sideC)) {
			this.sideA = sideA;
			this.sideB = sideB;
			this.sideC = sideC;
		} else {
			// 否则, 用默认的变长构成三角形
			this.init();
		}
	}

	/**
	 * 判断三条边是否能够组成三角形
	 * 
	 * @param sideA
	 *            边a的长度
	 * @param sideB
	 *            边b的长度
	 * @param sideC
	 *            边c的长度
	 * @return true可以组成三角形; false不能组成三角形
	 */
	private boolean isTriangle(double sideA, double sideB, double sideC) {
		// 边长必须大于0
		if ((sideA <= 0) || (sideB <= 0) || (sideC <= 0)) {
			System.err.println(SIDE_ERROR);
			return false;
		} else if ((sideA + sideB < sideC) || (sideA + sideC) < sideB
				|| (sideB + sideC < sideA)) {// 两边之和必须大于第三边
			System.err.println(SHAPE_ERROR);
			return false;
		}
		return true;
	}

	/**
	 * 获取A边
	 * 
	 * @return A边的值
	 */
	public double getSideA() {
		return sideA;
	}

	/**
	 * 设置A边
	 * 
	 * @param sideA
	 *            要设置的值
	 */
	public void setSideA(double sideA) {
		if (this.isTriangle(sideA, this.sideB, this.sideC)) {
			this.sideA = sideA;
		}
	}

	/**
	 * 获取B边
	 * 
	 * @return B边的值
	 */
	public double getSideB() {
		return sideB;
	}

	/**
	 * 设置B边
	 * 
	 * @param sideB
	 *            要设置的值
	 */
	public void setSideB(double sideB) {
		if (this.isTriangle(this.sideA, sideB, this.sideC)) {
			this.sideB = sideB;
		}
	}

	/**
	 * 获取C边
	 * 
	 * @return C边的值
	 */
	public double getSideC() {
		return sideC;
	}

	/**
	 * 设置C边
	 * 
	 * @param sideC
	 *            要设置的值
	 */
	public void setSideC(double sideC) {
		if (this.isTriangle(this.sideA, this.sideB, sideC)) {
			this.sideC = sideC;
		}
	}

	/**
	 * 使用海伦公式计算三角形的面积
	 * 
	 * @return 三角形的面积
	 */
	@Override
	public double getArea() {
		double s = (this.sideA + this.sideB + this.sideC) / 2;
		return Math
				.sqrt((s * (s - this.sideA) * (s - this.sideB) * (s - this.sideC)));
	}

	/**
	 * 计算三角形的周长
	 * 
	 * @return 三角形的周长
	 */
	@Override
	public double getGirth() {
		return this.getSideA() + this.getSideB() + this.getSideC();
	}

}
